package top.kaoshanji.p2ch23a;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * author kaoshanji
 * ^_^
 * create time 2025/3/2 18:26
 */
public class TraceJDKDynamicInvocationHandler implements InvocationHandler {

    private Object realObj;

    // 通过构造器将外部参数传入
    public TraceJDKDynamicInvocationHandler(Object realObj) {
        this.realObj = realObj;
    }

    // 框架逻辑的入口
    // proxy 表示代理对象本身，需要注意，它不是被代理的对象
    // method 表示正在被调用的方法
    // args 表示方法的参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("entering " + method.getName());

        // 依然是实际对象，故事就是从这里改变的
        // 获得方法调用的信息，就可以自定义逻辑了..可以使用实际对象，也可以调用特定的方法
        Object result = method.invoke(realObj, args);

        System.out.println("leaving " + method.getName());

        return result;
    }
}
